const fs = require('fs')
const path = require('path')
const archiver = require('archiver')

// 小程序构建脚本
class MiniprogramBuilder {
  constructor() {
    this.sourceDir = path.join(__dirname, 'miniprogram')
    this.distDir = path.join(__dirname, 'miniprogram-dist')
    this.zipPath = path.join(__dirname, 'miniprogram.zip')
  }

  // 清理目录
  cleanDir(dir) {
    if (fs.existsSync(dir)) {
      try {
        fs.rmSync(dir, { recursive: true, force: true })
      } catch (error) {
        console.log(`无法删除目录 ${dir}，尝试清空内容...`)
        try {
          const files = fs.readdirSync(dir)
          files.forEach(file => {
            const filePath = path.join(dir, file)
            if (fs.statSync(filePath).isDirectory()) {
              fs.rmSync(filePath, { recursive: true, force: true })
            } else {
              fs.unlinkSync(filePath)
            }
          })
        } catch (cleanError) {
          console.log(`清理目录失败: ${cleanError.message}`)
        }
      }
    }
  }

  // 复制文件
  copyFile(src, dest) {
    const destDir = path.dirname(dest)
    if (!fs.existsSync(destDir)) {
      fs.mkdirSync(destDir, { recursive: true })
    }
    fs.copyFileSync(src, dest)
  }

  // 复制目录
  copyDir(src, dest) {
    if (!fs.existsSync(dest)) {
      fs.mkdirSync(dest, { recursive: true })
    }

    const files = fs.readdirSync(src)
    files.forEach(file => {
      const srcPath = path.join(src, file)
      const destPath = path.join(dest, file)
      
      if (fs.statSync(srcPath).isDirectory()) {
        this.copyDir(srcPath, destPath)
      } else {
        this.copyFile(srcPath, destPath)
      }
    })
  }

  // 处理图标文件（将SVG转换为PNG的占位符）
  processIcons() {
    const iconsDir = path.join(this.distDir, 'images')
    const svgFiles = fs.readdirSync(iconsDir).filter(file => file.endsWith('.svg'))
    
    svgFiles.forEach(svgFile => {
      const pngFile = svgFile.replace('.svg', '.png')
      const svgPath = path.join(iconsDir, svgFile)
      const pngPath = path.join(iconsDir, pngFile)
      
      // 这里应该使用SVG转PNG的工具，暂时复制SVG文件
      // 在实际项目中，你需要使用sharp或其他工具来转换
      console.log(`需要将 ${svgFile} 转换为 ${pngFile}`)
      
      // 创建一个简单的占位符文件
      fs.writeFileSync(pngPath, 'PNG placeholder - 请使用设计工具创建实际的PNG图标')
      
      // 删除SVG文件
      fs.unlinkSync(svgPath)
    })
  }

  // 更新配置文件
  updateConfig() {
    const appJsonPath = path.join(this.distDir, 'app.json')
    const appJson = JSON.parse(fs.readFileSync(appJsonPath, 'utf8'))
    
    // 更新图标路径为PNG
    if (appJson.tabBar && appJson.tabBar.list) {
      appJson.tabBar.list.forEach(tab => {
        if (tab.iconPath) {
          tab.iconPath = tab.iconPath.replace('.svg', '.png')
        }
        if (tab.selectedIconPath) {
          tab.selectedIconPath = tab.selectedIconPath.replace('.svg', '.png')
        }
      })
    }
    
    fs.writeFileSync(appJsonPath, JSON.stringify(appJson, null, 2))
  }

  // 创建ZIP包
  async createZip() {
    return new Promise((resolve, reject) => {
      const output = fs.createWriteStream(this.zipPath)
      const archive = archiver('zip', {
        zlib: { level: 9 }
      })

      output.on('close', () => {
        console.log(`小程序包已创建: ${this.zipPath} (${archive.pointer()} bytes)`)
        resolve()
      })

      archive.on('error', (err) => {
        reject(err)
      })

      archive.pipe(output)
      archive.directory(this.distDir, false)
      archive.finalize()
    })
  }

  // 构建小程序
  async build() {
    try {
      console.log('开始构建小程序...')
      
      // 清理输出目录
      this.cleanDir(this.distDir)
      
      // 复制源文件
      console.log('复制源文件...')
      this.copyDir(this.sourceDir, this.distDir)
      
      // 处理图标
      console.log('处理图标文件...')
      this.processIcons()
      
      // 更新配置
      console.log('更新配置文件...')
      this.updateConfig()
      
      // 创建ZIP包
      console.log('创建ZIP包...')
      await this.createZip()
      
      console.log('小程序构建完成！')
      console.log('\n注意事项：')
      console.log('1. 请将 images/ 目录下的PNG占位符替换为实际的图标文件')
      console.log('2. 在 app.js 中更新 baseUrl 为你的服务器地址')
      console.log('3. 使用微信开发者工具导入项目进行调试')
      console.log('4. 确保服务器端API支持小程序的跨域请求')
      
    } catch (error) {
      console.error('构建失败:', error)
      process.exit(1)
    }
  }
}

// 运行构建
if (require.main === module) {
  const builder = new MiniprogramBuilder()
  builder.build()
}

module.exports = MiniprogramBuilder